自動化とシェルスクリプト

※タイトルの下に黒白反転用のリンクがあります。

※目次は見出しレベル2で確認できます。

/目次/自動化とシェルスクリプト

※見出しレベル3で各項目に飛べます。

このページではデータをバックアップするシェルスクリプトを紹介する。

シェルスクリプトとはコマンドを複数個まとめて書いた命令書のようなテキストファイルで拡張子は.sh。まずは、/基本的なファイル操作のコマンドで述べた通りファイルの作成、実行方法と権限について説明する。

ファイルの実行は、実行したいファイルを絶対パスか相対パスで指定するだけで実行できる。また、パスが長く頻繁に実行する場合、プログラミングと同じように変数名に格納して実行することもできる。

ファイルを作成して編集するには2通りある。一つは、使用するテキストエディタとファイルパスを指定する方法。もう一つは、ファイルを作るだけのコマンドtouchを使う。

./バックアップシェルスクリプト

任意のディレクトリ直下のディレクトリやファイルをバックアップするには以下の処理とコマンドが必要になる。

mkdirで任意のディレクトリに入りバックアップ先ディレクトリを作る。
cp -rで作成したディレクトリにバックアップしたいディレクトリをコピーする。

上記の処理を実際にファイルを作成して実行する。

notepad.exe bck1.shを実行。メモ帳が開いたら
mkdir /home/ユーザー名/バックアップ先ディレクトリ
cp -r /home/ユーザー名/バックアップしたいディレクトリ又はファイル /home/ユーザー名/作成したディレクトリ/を記述して保存。

ファイル作成時はデフォルトで実行できないようになっているので、bck1.shに実行権限を与える必要がある。権限を管理するコマンドはchmodchownがある。chmodとchownを使うためにはls -l ./bck1.shで表示された9列の内、1列目と3列目、4列目の見方を理解する必要がある。

1列目の一番初めはファイルである-が表示される。以降の9文字は、r(読み)、w(書き)、x(実行)の順番にユーザーが許された処理を示す。Linuxではユーザーが所属する「グループ」がある。初めの3文字はユーザー、次の3文字はグループ、次の3文字はその他に対する権限を示す。3列目はファイルの所属グループ、4列目は所有者の名前が表示される。例えばbck1.shはデフォルトで、
-rw-r--r-- 1 グループ名 ユーザー名 0 Mar 1 00:54 bck1.sh
となっている
始めの3文字はr(読み)とw(書き)と-(無許可)なのでユーザーはファイルの編集と閲覧ができる。
次の3文字はr(読み)と-(無許可)と-(無許可)なのでユーザー以外のグループ所属者はファイルの閲覧のみ許可されている。
最後の3文字はグループ所属者と同じrと-と-になっている。

始めの3文字中最後の文字が-になっており、ユーザーは実行権限が付与されていない。実行権限を付与するために以下のコマンドを実行する。
chmod +x ./bck1.sh
自分のユーザー名が4列目に表示されていなかった場合は
chown 新たな所属グループ:新たな所有者を実行。

実行権限が付与されたことで変更されない限り./bck1.shを実行することができる。

./複数のディレクトリを一行の実行で作成

シェルスクリプトではVBAやC/C++など他のプログラミング言語のように自動化あるいは効率化できる。大学の研究室では観測データの処理のためにシェルスクリプトを使った。このページではfor文を使ってフォルダを複数個作るシャルスクリプトを紹介する。

まずはフォルダの名前になるテキストデータを作成するため、以下のように一行ずつ記述したファイル(dirName)を作る。(拡張子.txtはつけなくて良い)
dir1
dir2
dir3
保存したらスクリプト(makeDir.sh)に以下を記述(拡張子必須)
for names in $(cat ./dirName); do
mkdir ./"$names"
done
上の3行を保存して実行すれば現在いるディレクトリにdir1、dir2、dir3の3つのディレクトリができる。

for 変数名 in 変数; do
処理
done
がfor(繰り返し)文の基本文法となる。

一行目の変数名はnamesを付けている。$()の()に記述されたcat ./dirNameは、CLIでコマンドを実行する時と同じ処理結果を得る事ができる。したがって一行目はfor names in "dir1" "dir2" "dir3"; do と同義になる。意味は、ある処理中に出てくるnamesにdir1を代入し、処理が一通り終わったらdir2をnamesに代入、また処理がおわったらdir3をnamesに代入せよと命令している。

2行目は、現在いるディレクトリ(./)に$namesというディレクトリを作成せよと命令している。ここで$はnamesが変数である事を意味するので以下の処理が行われる。

mkdir ./dir1
mkdir ./dir2
mkdir ./dir3

本記事では簡単な処理の一部のみ紹介している。これらの操作は慣れが必要で、興味をもってくれた人は何回も試すとすぐに慣れてくる。